package qualomelhor.gwt.modules.server;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import javax.servlet.http.HttpSession;
import qualomelhor.server.DAO;
import qualomelhor.util.Util;
import qualomelhor.database.Avatar;
import qualomelhor.database.BuscaComparacao;
import qualomelhor.database.BuscaProduto;
import qualomelhor.database.Categoria;
import qualomelhor.database.Comparacao;
import qualomelhor.database.Comparacao.TipoComparacao;
import qualomelhor.database.Email;
import qualomelhor.database.ExpressaoDB;
import qualomelhor.database.LinkBlobImage;
import qualomelhor.database.LinkCategoria_Produto;
import qualomelhor.database.LinkComparacao;
import qualomelhor.database.ParteAvatar;
import qualomelhor.database.PathComparacao;
import qualomelhor.database.PosicaoMaosDB;
import qualomelhor.database.Produto;
import qualomelhor.database.Resposta;
import qualomelhor.database.SequenciaExpressaoDB;
import qualomelhor.database.TermoIdioma;
import qualomelhor.database.Usuario;
import qualomelhor.database.ParametrosSistema.OrigemLogin;
import qualomelhor.database.VotoComparacaoProduto;
import qualomelhor.database.ParametrosSistema.SiteHost;
import qualomelhor.gwt.modules.client.ClientUtils;
import qualomelhor.gwt.modules.client.ISessionSuportService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.google.appengine.api.datastore.Blob;
import org.apache.commons.codec.binary.Base64; 

public class SessionSuportImpl extends RemoteServiceServlet implements ISessionSuportService {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override                                                                                                                                                                // key = locale, valor = nome da categoria traduzido
	public Boolean gravaCategoria(Long idCategoria, String nomeCategoria, boolean translate, Long idCategoriaPai, String enderecoFotoCategoria, String enderecoIcon, int ordem, boolean bloqueado, HashMap<String, String> mapLocale_Name) {
		System.out.println("Salvando categoria: id = " + idCategoria + ", nomeCategoria = " + nomeCategoria + ", idCategoriaPai = " + idCategoriaPai + ", enderecoFotoCategoria = " + enderecoFotoCategoria + ", ordem = " + ordem + ", bloqueado = " + bloqueado);
		boolean result = false;
		DAO d = new DAO();
		Categoria cat;
		byte nivel = 0;
		if (idCategoriaPai != null) {
			Categoria catPai = d.getCategoria(idCategoriaPai);
			nivel = (byte)(catPai.getNivel() + 1);
		}

		if (idCategoria != null) {
			cat = d.getCategoria(idCategoria);
			cat.setNomeCategoria(nomeCategoria);
			cat.setTranslate(translate);
			cat.setCategoriaPai(idCategoriaPai);
			cat.setNivel(nivel);
			cat.setEnderecoFotoCategoria(enderecoFotoCategoria);
			cat.setEnderecoIcon(enderecoIcon);
			cat.setOrdem(ordem);
			cat.setBloqueado(bloqueado);

		} else {
			cat = new Categoria(nomeCategoria, translate, idCategoriaPai, nivel, enderecoFotoCategoria, enderecoIcon, ordem, new Date());
		}
		result = d.gravaNovaCategoria(cat, mapLocale_Name);

		return result;
	}

	@Override
	public Boolean gravaProduto(Long id, String nomeProduto, Long idCategoria, String descricao, String enderecoFotoMini, ArrayList<String> listEnderecoFoto, ArrayList<Blob> listImageBlob, boolean bloqueado) {
		System.out.println("Salvando produto: id = " + id + ", nomeCategoria = " + nomeProduto + ", idCategoriaPai = " + idCategoria + ", descricao = " + descricao + ", enderecoFoto.size = " + listEnderecoFoto + ", enderecoFotoMini = " + enderecoFotoMini + ", bloqueado = " + bloqueado);
		boolean result = false;
		DAO d = new DAO();
		Produto prod;
		if (id == null) {
			prod = new Produto(nomeProduto, descricao, idCategoria, listEnderecoFoto, listImageBlob, enderecoFotoMini, new Date());
		} else {
			prod = d.getProduto(id);
		}
		if (prod != null) {
			prod.setNomeProduto(nomeProduto);
			prod.setIdCategoria(idCategoria);
			prod.setListEnderecoFoto(listEnderecoFoto);
			prod.setEnderecoFotoMini(enderecoFotoMini);
			prod.setBloqueado(bloqueado);
			d.gravaNovoProduto(prod);
			result = true;
		}
		return result;
	}

	@Override
	public ArrayList<Categoria> getListCategorias(boolean recarregar) {
		DAO d = new DAO();
		ArrayList<Categoria> listCategorias = d.getListaCategorias(recarregar);
		return listCategorias;
	}

	@Override
	public Boolean deletaCategoria(Long idCategoria) {
		DAO d = new DAO();
		boolean result = d.deletaCategoria(idCategoria);
		return result;
	}

	@Override
	public ArrayList<Produto> getListProdutos(boolean recarregar) {
		DAO d = new DAO();
		ArrayList<Produto> listProdutos = d.getListaProdutos(recarregar);
		return listProdutos;
	}

	@Override
	public Boolean deletaProduto(Long idProduto) {
		DAO d = new DAO();
		boolean result = d.deletaProduto(idProduto);
		return result;
	}

	@Override
	public Comparacao gravaComparacao1Coisa(Long idUsuario, String nomeProduto,  ArrayList<String> listEnderecoFoto, ArrayList<Blob> listImagesBlob, SiteHost site, String locale, String complementoPergunta) {
		DAO d = new DAO();

		System.out.println("gravando novo produto...");
		Produto p = new Produto(nomeProduto, "", 0L, listEnderecoFoto, listImagesBlob, "", new Date());
		d.gravaNovoProduto(p);
		System.out.println("novo produto gravado, tem id = " + p.getId());

		ArrayList<Long> listProdutoComp = new ArrayList<Long>(0);
		listProdutoComp.add(p.getId());

		HashMap<Long, String> mapNomeProdComp = new HashMap<Long, String>(0);
		for (Long l: listProdutoComp) {
			Produto prod = d.getProduto(l);
			if (prod != null) {
				mapNomeProdComp.put(l, prod.getNomeProduto());
			}
		}

		Comparacao c = new Comparacao(Comparacao.TipoComparacao.TIPO_COMPARACAO_1_PRODUTO, listProdutoComp, site, locale, new ArrayList<VotoComparacaoProduto>(0), new ArrayList<PathComparacao>(0), ClientUtils.getRandomAvatar(), mapNomeProdComp, idUsuario, new Date());
		c.getListPathComparacao().add(new PathComparacao(Util.converteEmLink(complementoPergunta.trim() + " " + p.getNomeProduto()), site, complementoPergunta));

		Comparacao result = null;
		if (d.gravaNovaComparacao(c)) {
			result = c;
		}
		return result;
	}

	@Override
	public ArrayList<ParteAvatar> getListParteAvatar(boolean recarregar) {
		DAO d = new DAO();
		ArrayList<ParteAvatar> listParteAvatar = d.getListaParteAvatar(recarregar);
		return listParteAvatar;
	}

	@Override
	public Boolean deletaParteAvatar(Long idParte) {
		DAO d = new DAO();
		boolean result = d.deletaParteAvatar(idParte);
		return result;
	}

	@Override
	public Boolean gravaParteAvatar(Long id, String nomeArquivo, int tipoParteCorpo) {
		System.out.println("Salvando produto: id = " + id + ", nomeArquivo = " + nomeArquivo + ", tipoParteCorpo = " + tipoParteCorpo);
		boolean result = false;
		DAO d = new DAO();
		ParteAvatar p;
		if (id == null) {
			p = new ParteAvatar(nomeArquivo, tipoParteCorpo);
		} else {
			p = d.getParteAvatar(id);
		}
		if (p != null) {
			p.setNomeArquivo(nomeArquivo);
			p.setTipoParteCorpo(tipoParteCorpo);
			d.gravaNovaParteAvatar(p);
			result = true;
		}
		return result;
	}

	@Override
	public ArrayList<Comparacao> getListComparacao(boolean recarregar) {
		DAO d = new DAO();
		ArrayList<Comparacao> listComparacao = d.getListaComparacao(recarregar);
		return listComparacao;
	}

	@Override
	public Boolean deletaComparacao(Long idComparacao) {
		DAO d = new DAO();
		boolean result = d.deletaComparacao(idComparacao);
		return result;
	}

	@Override
	public Comparacao gravaComparacao(Long id, TipoComparacao tipoComparacao, ArrayList<Long> listProdutoComp, ArrayList<PathComparacao> listPathComparacao, SiteHost site, String locale, Avatar av) {
		System.out.println("Salvando comparacao: id = " + id + ", tipoComparacao = " + tipoComparacao + ", listPath.size = " + listPathComparacao.size() + ", siteOriginal = " + site.getHost() + ", locale = " + locale);
		Comparacao result = null;
		DAO d = new DAO();

		HashMap<Long, String> mapNomeProdComp = new HashMap<Long, String>(0);
		System.out.println("listProdutoComp.size = " + listProdutoComp.size());
		for (Long l: listProdutoComp) {
			if (l != null) {
				System.out.println("l prod id = " + l);	
				Produto p = d.getProduto(l);
				if (p != null) {
					mapNomeProdComp.put(l, p.getNomeProduto());
				}
			}
		}

		Comparacao comp;
		if (id == null) {
			comp = new Comparacao(tipoComparacao, listProdutoComp, site, locale, new ArrayList<VotoComparacaoProduto>(0), listPathComparacao, av, mapNomeProdComp, 0L, new Date());
		} else {
			comp = d.getComparacao(id);
		}
		if (comp != null) {
			comp.setTipoComparacao(tipoComparacao);
			comp.setListProdutoComp(listProdutoComp);
			comp.setListPathComparacao(listPathComparacao);
			comp.setSiteOriginal(site);
			comp.setLocale(locale);
			comp.setAvatar(av);
			comp.setMapNomeProdComp(mapNomeProdComp);
			if (d.gravaNovaComparacao(comp)) {
				result = comp;
			} else {
				result = null;
			}
		}
		return result;
	}

	@Override
	public Comparacao gravaComparacao2Coisas(Long idUsuario, String nomeProduto1, String nomeProduto2, ArrayList<String> listEnderecoFotoProd1, ArrayList<String> listDataUrlImagesProd1, ArrayList<String> listEnderecoFotoProd2, ArrayList<String> listDataUrlImagesProd2, SiteHost site, String locale, String complementoPergunta, Avatar av) {
		System.out.println("Salvando comparacao: id = " + idUsuario + ", nomeProduto1 = " + nomeProduto1 + ", nomeProduto2 = " + nomeProduto2 + ", listEnderecoProd1.size = " + listEnderecoFotoProd1.size() + ", listEnderecoProd2.size = " + listEnderecoFotoProd2.size() + ", idSite = " + site.getHost() + ", complementoPergunta = " + complementoPergunta);
		System.out.println("listDataUrlProd1.size = " + listDataUrlImagesProd1.size());
		System.out.println("listDataUrlProd2.size = " + listDataUrlImagesProd2.size());
		DAO d = new DAO();

		//String locale = carregaLocaleAtual();

		Usuario u = null;
		if (idUsuario.longValue() == 0) {
			u = d.getUsuario("anonimo@anonimo.com");
			if (u == null) {
				System.out.println("Usuario anonimo nao encontrado!");	
			} else {
				idUsuario = u.getId();
				System.out.println("Usuario atual anonimo...id = " + u.getId());
			}
		}

		Categoria cPendente = d.getCategoriaByName("PENDENTE");
		System.out.println("gravando novo produto...");

		ArrayList<Blob> listBlobProd1 = new ArrayList<Blob>(0);
		for (String s: listDataUrlImagesProd1) {
			String str = s.split(";base64,")[1];
			System.out.println("[" + str + "]");
			//listBlobProd1.add(new Blob(Base64.decodeBase64(str.getBytes())));
			long idLinkBlob = d.gravaNovoLinkBlobImage(new LinkBlobImage("", new Blob(Base64.decodeBase64(str.getBytes()))), false);
			System.out.println("idLinkBlob = " + idLinkBlob);
			listEnderecoFotoProd1.add("/img/" + idLinkBlob);
			//System.out.println("base 64 erro prod1!!!!!!!!!");
		}

		ArrayList<Blob> listBlobProd2 = new ArrayList<Blob>(0);
		for (String s: listDataUrlImagesProd2) {
			System.out.println("listDataurlImagesProd2 = [" + s + "]");
			String str = s.split(";base64,")[1];
			System.out.println("[" + str + "]");
			//listBlobProd2.add(new Blob(Base64.decodeBase64(str.getBytes())));
			long idLinkBlob = d.gravaNovoLinkBlobImage(new LinkBlobImage("", new Blob(Base64.decodeBase64(str.getBytes()))), false);
			System.out.println("idLinkBlob = " + idLinkBlob);
			listEnderecoFotoProd2.add("/img/" + idLinkBlob);
		}

		System.out.println("listBlobProd1.size = " + listBlobProd1.size());
		System.out.println("listBlobProd2.size = " + listBlobProd2.size());

		Produto p1 = new Produto(nomeProduto1, "", cPendente.getId(), listEnderecoFotoProd1, listBlobProd1, "", new Date());
		d.gravaNovoProduto(p1);
		System.out.println("novo produto 1 gravado, tem id = " + p1.getId());

		Produto p2 = new Produto(nomeProduto2, "", cPendente.getId(), listEnderecoFotoProd2, listBlobProd2, "", new Date());
		d.gravaNovoProduto(p2);
		System.out.println("novo produto 2 gravado, tem id = " + p2.getId());

		ArrayList<Long> listProdutoComp = new ArrayList<Long>(0);
		listProdutoComp.add(p1.getId());
		listProdutoComp.add(p2.getId());

		HashMap<Long, String> mapNomeProdComp = new HashMap<Long, String>(0);
		mapNomeProdComp.put(p1.getId(), p1.getNomeProduto());
		mapNomeProdComp.put(p2.getId(), p2.getNomeProduto());

		ArrayList<PathComparacao> listPathCompacao = new ArrayList<PathComparacao>(0);
		listPathCompacao.add(new PathComparacao(
									Util.converteEmLink(
										Util.removeAcentuacao((complementoPergunta.trim() + " " + p1.getNomeProduto().trim() + " " + Util.getConstant("ou", locale) + " " + p2.getNomeProduto().trim()).trim().toLowerCase())
									), site, complementoPergunta
								)
							);
		
		
		Comparacao c = new Comparacao(Comparacao.TipoComparacao.TIPO_COMPARACAO_2_PRODUTOS, listProdutoComp, site, locale, new ArrayList<VotoComparacaoProduto>(0), listPathCompacao, av, mapNomeProdComp, idUsuario, new Date());


		System.out.println("c.getListPathComparacao().get(0).path = " + c.getListPathComparacao().get(0).getPath());

		Comparacao result = c;
		if (d.gravaNovaComparacao(c)) {
			System.out.println("Entrou.. gravacao deveria ter sido concluida!");
			//Criar os links
			/*
			for (int i = 0; i < c.getListPathComparacao().size(); i++) {
				LinkComparacao link = new LinkComparacao(c.getListPathComparacao().get(i).getPath(), c.getId(), c.getSiteOriginal(), u.getPais());
				d.gravaNovoLinkComparacao(link);
				System.out.println("Gravou o link da comparacao...id:" + link.getId() + "link:[" + link.getLink() + "]");
			}
			*/
			result = c;
			System.out.println("result = " + result);
			System.out.println("result.getId() = " + result.getId());
		} else {
			result = null;
			System.out.println("Erro ao gravar a comparacao.. dao retornou false..");
		}
		System.out.println("result = " + result);
		return result;
	}

	@Override
	public Boolean deletaPathComparacao(Long idComp, SiteHost site) {
		DAO d = new DAO();
		boolean result = d.deletaPathComparacao(idComp, site);
		return result;
	}

	@Override
	public Comparacao addPathComparacao(Long idComparacao, String path, SiteHost site, String complementoPergunta) {
		DAO d = new DAO();
		Comparacao result = d.addPathComparacao(idComparacao, path, site, complementoPergunta);
		return result;
	}

	@Override
	public Boolean deletaBusca(Long idProd, String busca) {
		DAO d = new DAO();
		boolean result = d.deletaBusca(idProd, busca);
		return result;
	}

	@Override
	public Boolean addBusca(Long idProduto, String busca) {
		DAO d = new DAO();
		boolean result = d.addBusca(idProduto, busca);
		return result;
	}

	@SuppressWarnings("unchecked")
	@Override
	public HashMap<String, Object> carregaSessaoAtual() {
		HttpSession session = getThreadLocalRequest().getSession();
		return (HashMap<String, Object>)session.getAttribute("SESSIONVAR");
	}

	@Override
	public Boolean gravaPosicaoMao(PosicaoMaosDB pMaoDB) {
		System.out.println("Salvando PosicaoMaosDB...");
		DAO d = new DAO();
		return d.gravaNovaPosicaoMaoDB(pMaoDB);
	}

	@Override
	public PosicaoMaosDB carregaPosicaoMaoDB(String nome) {
		DAO d = new DAO();
		return d.getPosicaoMaoDB(nome);
	}

	@Override
	public Boolean deletaPosicaoMaoDB(String nome) {
		DAO d = new DAO();
		boolean result = d.deletaPosicaoMaoDB(nome);
		return result;
	}

	@Override
	public Boolean gravaExpressao(ExpressaoDB exprDB) {
		boolean result = false;
		System.out.println("Salvando ExpressaoDB...");
		DAO d = new DAO();
		ExpressaoDB tmpExpr = d.getExpressaoDB(exprDB.getNome());
		if (tmpExpr != null) {
			tmpExpr.setAnimar(exprDB.getAnimar());
			tmpExpr.setVelocidadeD(exprDB.getVelocidadeD());
			tmpExpr.setVelocidadeE(exprDB.getVelocidadeE());
			tmpExpr.setRiscarD(exprDB.getRiscarD());
			tmpExpr.setRiscarE(exprDB.getRiscarE());
			tmpExpr.setPosicaoBoca(exprDB.getPosicaoBoca());
			tmpExpr.setMovimentoSobrancelha(exprDB.getMovimentoSobrancelha());
			tmpExpr.setPosicaoMaos(exprDB.getPosicaoMaos());
			tmpExpr.setPosicaoOlhoBoneco(exprDB.getPosicaoOlhoBoneco());
			result = d.gravaNovaExpressaoDB(tmpExpr);
		} else {
			result = d.gravaNovaExpressaoDB(exprDB); 
		}

		return result;
	}

	@Override
	public ExpressaoDB carregaExpressaoDB(String nome) {
		DAO d = new DAO();
		return d.getExpressaoDB(nome);
	}

	@Override
	public Boolean deletaExpressaoDB(String nome) {
		DAO d = new DAO();
		boolean result = d.deletaExpressaoDB(nome);
		return result;
	}

	@Override
	public SequenciaExpressaoDB carregaSequenciaExpressaoDB(String nome) {
		DAO d = new DAO();
		return d.getSequenciaExpressaoDB(nome);
	}

	@Override
	public Boolean gravaSequenciaExpressao(SequenciaExpressaoDB seqExprDB) {
		boolean result = false;
		System.out.println("Salvando SequenciaExpressaoDB...");
		DAO d = new DAO();
		SequenciaExpressaoDB seq = d.getSequenciaExpressaoDB(seqExprDB.getNome());
		if (seq != null) {
			seq.setListExpressao(seqExprDB.getListExpressao());
			seq.setListTempoLoop(seqExprDB.getListTempoLoop());
			seq.setReestart(seqExprDB.getReestart());
			seq.setFrameRestart(seqExprDB.getFrameRestart());
			seq.setTempoRestart(seqExprDB.getTempoRestart());
			result = d.gravaNovaSequenciaExpressaoDB(seq);
		} else {
			result = d.gravaNovaSequenciaExpressaoDB(seqExprDB);
		}
		return result;
	}

	@Override
	public Boolean gravaMatrExpressao(ArrayList<ExpressaoDB> listExprDB) {
		System.out.println("Salvando lista ExpressaoDB...");
		boolean result = true;
		for (int i = 0; i < listExprDB.size(); i++) {
			result = result && gravaExpressao(listExprDB.get(i));
		}
		return result;
	}

	@Override
	public Boolean deletaTodasExpressoesDB() {
		DAO d = new DAO();
		ArrayList<ExpressaoDB> listP = d.getListaExpressaoDB();
		boolean result = true;
		System.out.println("list.size = " + listP.size());
		for (int i = 0; i < listP.size(); i++) {
			System.out.println("Deletando..." + listP.get(i).getNome());
			result = result && d.deletaExpressaoDB(listP.get(i).getNome());
		}

		return result;
	}

	@Override
	public Boolean deletaTodasPosicoesMaosDB() {
		DAO d = new DAO();
		ArrayList<PosicaoMaosDB> listP = d.getListaPosicaoMaos();
		boolean result = true;
		System.out.println("list.size = " + listP.size());
		for (int i = 0; i < listP.size(); i++) {
			System.out.println("Deletando..." + listP.get(i).getNome());
			result = d.deletaPosicaoMaoDB(listP.get(i).getNome()) && result;
			System.out.println("result ..." + result);
		}

		return result;
	}

	@Override
	public int gravaVoto(Long idComparacao,	Long idUsuario, Long idProduto, String coment) {
		System.out.println("Gravando VotoComparacao...");
		int result = 0;
		DAO d = new DAO();

		Usuario u = d.getUsuario(idUsuario);

		if (u != null) {

			Comparacao c = d.getComparacao(idComparacao);

			if (c != null) {
				if (c.getListVotoComparacaoProdutos() == null) {
					c.setListVotoComparacaoProdutos(new ArrayList<VotoComparacaoProduto>(0));
				}
				int id = c.getListVotoComparacaoProdutos().size();
				System.out.println("Num List Voto Comparacao = " + id);
				final String ipUser = getThreadLocalRequest().getRemoteAddr();
				c.getListVotoComparacaoProdutos().add(new VotoComparacaoProduto(idUsuario, u.getNomeUsuario(), ((u.getOrigemLogin() == OrigemLogin.FACEBOOK.getSiteOrigem())?"http://graph.facebook.com/" + u.getUserId() + "/picture":"/images/anonyuser.jpg"), idProduto, coment, id, ipUser, ""));
				System.out.println("vai gravar a comparacao com o voto incluido!");
				
				if (d.gravaAtualizacaoComparacao(c)) {
					System.out.println("Voto Comparacao gravado. Num List = " + c.getListVotoComparacaoProdutos().size());
					result = id;
				} else {
					System.out.println("Voto Comparacao Nao Gravado!");
				}
			}
		}
		return result;
	}

	@Override
	public int alteraVoto(int idVoto, Long idComparacao, Long idUsuario, String coment) {
		System.out.println("alterando VotoComparacao...");
		int result = 0;
		DAO d = new DAO();

		Comparacao c = d.getComparacao(idComparacao);

		if (c != null && c.getListVotoComparacaoProdutos() != null && c.getListVotoComparacaoProdutos().size() > 0) {
			for (VotoComparacaoProduto v: c.getListVotoComparacaoProdutos()) {
				if (v.getId() == idVoto && v.getIdUsuario().equals(idUsuario)) {
					int id = v.getId();
					System.out.println("Num List Voto Comparacao = " + id);
					final String ipUser = getThreadLocalRequest().getRemoteAddr();
					v.setComentario(coment);
					v.setIpUser(ipUser);
					System.out.println("vai gravar a comparacao com o voto incluido!");

					if (d.gravaAtualizacaoComparacao(c)) {
						System.out.println("Voto Comparacao gravado. Num List = " + c.getListVotoComparacaoProdutos().size());
						result = id;
					} else {
						System.out.println("Voto Comparacao Nao Gravado!");
					}
				}
			}
		}
		return result;
	}

	@Override
	public Boolean deletaVoto(int idVoto, Long idComparacao, Long idUsuario) {
		System.out.println("deletando VotoComparacao...");
		boolean result = false;
		DAO d = new DAO();

		Comparacao c = d.getComparacao(idComparacao);

		if (c != null && c.getListVotoComparacaoProdutos() != null && c.getListVotoComparacaoProdutos().size() > 0) {
			for (int i = 0; i < c.getListVotoComparacaoProdutos().size(); i++) {
				VotoComparacaoProduto v = c.getListVotoComparacaoProdutos().get(i);
				if (v.getId() == idVoto && v.getIdUsuario().equals(idUsuario)) {
					c.getListVotoComparacaoProdutos().remove(i);

					if (d.gravaAtualizacaoComparacao(c)) {
						System.out.println("Voto Comparacao gravado. Num List = " + c.getListVotoComparacaoProdutos().size());
						result = true;
					} else {
						System.out.println("Voto Comparacao Nao Gravado!");
					}
				}
			}
		}
		return result;
	}

	@Override
	public Boolean gravaProdutoMerge(Produto pNovo, Long pAnt1, Long pAnt2) {
		System.out.println("Gravando Produto merge...");
		boolean result = false;	
		DAO d = new DAO();

		result = d.gravaNovoProduto(pNovo);
		System.out.println("Produto gravado: result = " + result);
		if (result) {

			//alterar as buscas
			System.out.println("Alterando as buscas");
			ArrayList<BuscaComparacao> listBuscaComp = d.getListaBuscaComparacao(pAnt1, pAnt2);
			for (BuscaComparacao bsc: listBuscaComp) {
				if (bsc.getIdProduto().equals(pAnt1) || bsc.getIdProduto().equals(pAnt2)) {
					bsc.setIdProduto(pNovo.getId());
					result = d.gravaNovaBuscaComparacao(bsc, false);
				}
			}

			System.out.println("Alterando id comparacoes antigas");
			//alterar todos os id de comparacoes dos produtos antigos.
			ArrayList<Comparacao> listComp = d.getListaComparacao(pAnt1, pAnt2);
			for (Comparacao c: listComp) {

				c.getListProdutosComp().remove(pAnt1);
				c.getListProdutosComp().remove(pAnt2);
				c.getListProdutosComp().add(pNovo.getId());

				//atualiza os votos comparacao
				for (VotoComparacaoProduto v: c.getListVotoComparacaoProdutos()) {
					if (v.getIdProduto().equals(pAnt1) || v.getIdProduto().equals(pAnt2)) {
						v.setIdProduto(pNovo.getId());
					}
				}

				result = d.gravaNovaComparacao(c);
			}

			System.out.println("Alterando as busca produto");
			//syncronizar a busca do produto
			ArrayList<BuscaProduto> listBuscaProd = d.getListaBuscaProduto(pAnt1, pAnt2);
			System.out.println("listBuscaProd.size = " + listBuscaProd.size());
			for (BuscaProduto bscP: listBuscaProd) {
				if (bscP.getIdProduto().equals(pAnt1) || bscP.getIdProduto().equals(pAnt2)) {
					System.out.println("setando novo idproduto em buscaProduto: id Prod: " + pNovo.getId());		
					bscP.setIdProduto(pNovo.getId());
					result = d.gravaNovaBuscaProduto(bscP, true);
					System.out.println("setando novo idproduto result: " + result);
				}
			}
			
			if (result) {
				System.out.println("deletando o produto antigo 1");
				deletaProduto(pAnt1);
				System.out.println("deletando o produto antigo 2");
				deletaProduto(pAnt2);
			}
		}

		return result;
	}

	@Override
	public Boolean teste(boolean b) {
		System.out.println("b = " + b);
		return b;
	}

	@Override
	public Boolean gravaVotoComparacao(Long idComparacao) {
		System.out.println("idcomparacao = " + idComparacao);
		return true;
	}

	@Override
	public int gravaRespostaComentario(Long idComparacao, int idVoto, String pathId, Long idUsuario, String coment) {
		System.out.println("Gravando Resposta...");
		System.out.println("pathId = [" + pathId + "]");
		String[] strPath = pathId.split("-");

		for (int i = 0; i < strPath.length; i++) {
			System.out.println("strPath[" + i + "] = [" + strPath[i] + "]");
		}

		int result = 0;
		int id = -1;
		DAO d = new DAO();

		Usuario u = d.getUsuario(idUsuario);

		if (u != null) {
			System.out.println("Usuario ok...");

			Comparacao c = d.getComparacao(idComparacao);

			if (c != null) {
				System.out.println("Comparacao ok...");

				if (c.getListVotoComparacaoProdutos() == null) {
					c.setListVotoComparacaoProdutos(new ArrayList<VotoComparacaoProduto>(0));
					System.out.println("lista voto estava nula!");
				}

				final String ipUser = getThreadLocalRequest().getRemoteAddr();

				System.out.println("Vai procurar o voto: idVoto...:" + idVoto);
				for (VotoComparacaoProduto v: c.getListVotoComparacaoProdutos()) {
					if (v.getId() == idVoto) {
						System.out.println("encontrou o voto: idVoto...:" + idVoto);
						if (pathId.equals("")) {
							System.out.println("Adicionando a resposta direta ao voto principal...");
							id = v.getListResposta().size();
							v.getListResposta().add(new Resposta(idUsuario, u.getNomeUsuario(), ((u.getOrigemLogin() == OrigemLogin.FACEBOOK.getSiteOrigem())?"http://graph.facebook.com/" + u.getUserId() + "/picture":"/images/anonyuser.jpg"), coment, id, ipUser, ""));
						} else {
							System.out.println("Entrou na busca do path..strpath.lenght = " + strPath.length);
							Resposta r = null;
							if (v.getListResposta().size() > 0) {
								r = v.getListResposta().get(Integer.parseInt(strPath[0]));
							}

							for (int k = 1; k < strPath.length; k++) {
								if (r.getListResposta().size() > 0) {
									r = r.getListResposta().get(Integer.parseInt(strPath[k]));
								}
							}

							if (r != null) {
								System.out.println("Achou a sub resposta...");
								id = r.getListResposta().size();
								r.getListResposta().add(new Resposta(idUsuario, u.getNomeUsuario(), ((u.getOrigemLogin() == OrigemLogin.FACEBOOK.getSiteOrigem())?"http://graph.facebook.com/" + u.getUserId() + "/picture":"/images/anonyuser.jpg"), coment, id, ipUser, ""));
							} else {
								System.out.println("Sub resposta nao encontrada...");
							}
						}
						System.out.println("vai gravar a resposta!");

						if (d.gravaAtualizacaoComparacao(c)) {
							System.out.println("gravou ok!");
							result = id;
						} else {
							System.out.println("nao gravou!");
						}
						System.out.println("c.listRespostas.size = " + v.getListResposta().size());
						break;
					}
				}
			} else {
				System.out.println("Nao achou a comparacao ou lista voto comparacao nula...");
			}
		
		}
		System.out.println("result = " + result);
		return result;
	}

	@Override
	public ArrayList<TermoIdioma> getListTermoIdioma(int offset, int limit, boolean orderByLocaleFirst, boolean somenteSemTraducao) {
		DAO d = new DAO();
		ArrayList<TermoIdioma> listTermos = d.getListaTermoIdioma(offset, limit, orderByLocaleFirst, somenteSemTraducao);
		return listTermos;
	}

	@Override
	public Boolean deletaTermoIdioma(Long id) {
		DAO d = new DAO();
		boolean result = d.deletaTermoIdioma(id);
		return result;
	}

	@Override
	public Boolean deletaLocaleCategoria(Long idCategoria, String locale) {
		DAO d = new DAO();
		boolean result = d.deletaLocaleCategoria(idCategoria, locale);
		return result;
	}

	@Override
	public Boolean addLocaleCategoria(Long idCategoria, String locale, String nomeTraduzido) {
		DAO d = new DAO();
		boolean result = d.addLocaleCategoria(idCategoria, locale, nomeTraduzido);
		return result;
	}

	@Override
	public String carregaLocaleAtual() {
		HttpSession session = getThreadLocalRequest().getSession();
		return (String)session.getAttribute("LOCALE");
	}

	@Override
	public Usuario carregaUsuarioAtual() {
		HttpSession session = getThreadLocalRequest().getSession();
		return (Usuario)session.getAttribute("USUARIOATUAL");
	}

	@Override
	public Boolean salvaLinkBlogComparacao(Long idComparacao, Long idUsuarioLink, String nomeBlog, String link) {
		DAO d = new DAO();
		boolean result = d.salvaLinkBlogComparacao(idComparacao, idUsuarioLink, nomeBlog, link);
		return result;
	}

	@Override
	public Produto carregaProduto(Long idProduto) {
		System.out.println("Carrendo produto..." + idProduto);
		DAO d = new DAO();
		Produto p = d.getProduto(idProduto);
		return p;
	}

	@Override
	public Boolean enviaEmail(String assunto, String nome, String email, String mensagem) {
		boolean result = false; 
		DAO d = new DAO();
		result = d.gravaNovoEmail(new Email(new String[]{"rodteixo2@yahoo.com.br"}, assunto, "Enviado Por:" + email + "\r\nMensagem:\r\n\r\n" + mensagem, "text/plain", new Date()));
		return result;
	}

	@Override
	public Boolean gravaTermoIdioma(Long id, String nomeTermo, String locale, String traducao) {
		boolean result = false;
		DAO d = new DAO();
		TermoIdioma t = new TermoIdioma(nomeTermo, locale, traducao);
		if (!id.equals(0L)) {
			t.setId(id);
		}
		result = d.gravaNovoTermoIdioma(t);
		return result;
	}

	@Override
	public ArrayList<LinkCategoria_Produto> carregaListLinkProduto(Long idProduto) {
		DAO d = new DAO();
		ArrayList<LinkCategoria_Produto> listLinkProduto = d.getListaLinkProduto(idProduto);
		return listLinkProduto;
	}

	@Override
	public ArrayList<LinkComparacao> carregaListLinkComparacao(Long idComparacao) {
		DAO d = new DAO();
		ArrayList<LinkComparacao> listLinkComp = d.getListaLinkComparacao(idComparacao);
		return listLinkComp;
	}

	@Override
	public ArrayList<BuscaComparacao> carregaListaBuscaComparacao(Long idProduto) {
		DAO d = new DAO();
		ArrayList<BuscaComparacao> listLinkComp = d.getListaBuscaComparacao(idProduto, null);
		return listLinkComp;
	}

	@Override
	public ArrayList<BuscaComparacao> carregaListaBuscaComparacaoPorIdComparacao(Long idComparacao) {
		DAO d = new DAO();
		ArrayList<BuscaComparacao> listLinkComp = d.getListaBuscaComparacao(idComparacao);
		return listLinkComp;
	}

	@Override
	public Boolean salvaShareFBID(Long idComparacao, String idShare) {
		DAO d = new DAO();
		Comparacao c = d.getComparacao(idComparacao);
		if (c.getListSharesID_FB() == null) {
			c.setListSharesFB_Id(new ArrayList<String>(0));
		}
		c.getListSharesID_FB().add(idShare);
		boolean result = false;
		result = d.gravaNovaComparacao(c);
		return result;
	}
}